package org.tity.commons.network.webservice;

import java.util.HashMap;

import com.alibaba.fastjson.JSONObject;

/**
 * WebService 调用客户端
 * @author 李方捷
 * 不稳定，建议直接使用IDE生成的客户端代码调用；
 * */
public abstract  class WebServiceClient {
	
	private static HashMap<String, WebServiceClient> CLIENTS=new HashMap<String, WebServiceClient>();

	
	/**
	 * 获得CXF实现的 WebService 调用客户端
	 * @param wsdl  wsdl 地址
	 * @return WebServiceClient
	 * */
	public static WebServiceClient  getCXFClient(String wsdl)
	{
		return getClient(wsdl, "CXF");
	}
	
	/**
	 * 获得CXF实现的 WebService 调用客户端
	 * @param wsdl  wsdl 地址
	 * @return WebServiceClient
	 * */
	public static WebServiceClient  getAXIS2Client(String wsdl)
	{
		return getClient(wsdl, "AXIS2");
	}
	
	/**
	 * 获得 WebService 调用客户端
	 * @param wsdl  wsdl 地址
	 * @return WebServiceClient
	 * @param  type 类型
	 * */
	private static WebServiceClient  getClient(String wsdl,String type)
	{
		WebServiceClient  client = CLIENTS.get(wsdl);
		if(client==null)
		{
			if("CXF".equals(type))
			{
				client = new CXFClient(wsdl);
			}
			else if("AXIS2".equals(type))
			{
				client = new AXIS2Client(wsdl);
			}
			CLIENTS.put(wsdl,client);
		}
		return client;
	}
 
	private String wsdl=null;
	
	public String getWsdl() {
		return wsdl;
	}
	
	/**
	 * @param wsdl  wsdl 地址
	 * */
	public WebServiceClient(String wsdl)
	{
		this.wsdl=wsdl;
	}
	
	/**
     *  调用WebService方法<br>
     *  如果参数为常规数值类型，则直接传值；如果参数为pojo类型则可以使用对用的Pojo类型或Map类型，方法内自动转换成WebService需要的类型
     * @param  methodName 方法名
     * @param params  参数列表
     * @return  返回结果
     * */
    public abstract JSONObject invoke(String methodName,Object... params);
    
	
}
